import Vue from 'vue';
import App from './App';
import config from '@/common/config.js'
import { Tracker } from '@/common/tracker'

Vue.config.productionTip = false;

App.mpType = 'app';

const utils = {
	toInt: function(val) {
		val = parseInt(val);
		if (isNaN(val)) val = 0;
		return val;
	},
	toFloat: function(val) {
		val = parseFloat(val);
		if (isNaN(val)) val = 0;
		return Math.round(val * 100) / 100;
	},
	rmoney: function(s) {
		s = s || 0;
		var val = typeof s !== 'number' ? parseFloat(s.replace(/[^\d\.-]/g, "")) : s;
		if (isNaN(val)) val = 0;
		return Math.round(val * 100) / 100;
	},
	formatSize: function(size) {
		size = utils.toInt(size);
		if (size < 1024) return size + "B";
		size = size / 1024;
		if (size < 1024) return utils.toFloat(size) + "KB";
		size = size / 1024;
		if (size < 1024) return utils.toFloat(size) + "MB";
	},
	getFileExt:function (name) {
		var i = name.lastIndexOf('\.'), ext = "";
		if (i !== -1) {
			ext = name.substring(i + 1).toLocaleLowerCase();
		}
		return ext;
	},
	curDateTime(format) {
		format = format || '';
		var str = '',
			date = new Date(),
			year = date.getFullYear(),
			month = date.getMonth() + 1,
			day = date.getDate(),
			hour = date.getHours() < 10 ? '0' + date.getHours() : date.getHours(),
			minute = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes(),
			second = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds();
		month >= 1 && month <= 9 ? (month = '0' + month) : '';
		day >= 0 && day <= 9 ? (day = '0' + day) : '';
		
		switch(format) {
			case 'yyyy':
				str = year;
				break;
			case 'yyyyMM':
				str = year + '-' + month;
				break;
			case 'yyyyMMdd':
				str = year + '-' + month + '-' + day;
				break;
			case 'yyyyMMddHHmm':
				str = year + '-' + month + '-' + day + ' ' + hour + ':' + minute;
				break;
			default:
				str = year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + second;
				break;
		}
		return str;
	},
	/**
	 * 金额按千位逗号分割,数字千分位格式化
	 * @public
	 * @param mixed mVal 数值
	 * @return string
	 *
	 * Example
	 * <code>
	 * alert(utils.formatMoney(1234.345)); //=>1,234.35
	 * alert(utils.formatMoney(-1234.345)); //=>-1,234.35
	 * </code>
	 */
	formatMoney: function(mVal, suf) {
		var num = mVal?.toString();
		if (!num) return "0.00";
		num = num.toString().replace(/\$|\,/g, ''); // 去除$符号
		if (isNaN(num)) num = "0.00";
		var sign = (num == (num = Math.abs(num)));
		num = Math.floor(num * 100 + 0.50000000001);
		var cents = num % 100;
		num = Math.floor(num / 100).toString();
		if (cents < 10) cents = "0" + cents;
		for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3); i++) num = num.substring(0, num.length - (
			4 * i + 3)) + ',' + num.substring(num.length - (4 * i + 3));
		return ((suf ? suf : "") + ((sign) ? '' : '-') + '' + num + '.' + cents);
	},
	
	/**
	 * 将千分位格式的数字字符串转换为浮点数
	 * @public
	 * @param string sVal 数值字符串
	 * @return float
	 *
	 * Example
	 * <code>
	 * alert(utils.unformatMoney("1,234.345")); //=>1234.35
	 * alert(utils.unformatMoney("-1,234.345")); //=>-1234.35
	 * </code>
	 */
	unformatMoney: function(sVal) {
		var fTmp = parseFloat(sVal.replace(/,/g, ''));
		return (isNaN(fTmp) ? 0 : fTmp);
	},
	
	getPic: function(url){
		return Vue.prototype.fileURL + url
	}
}

// 引入全局uView
import uView from 'uview-ui';
Vue.use(uView);

// 此处为演示vuex使用，非uView的功能部分
import store from '@/store';

// 引入uView提供的对vuex的简写法文件
let vuexStore = require('@/store/$u.mixin.js');
Vue.mixin(vuexStore);

// 引入uView对小程序分享的mixin封装
let mpShare = require('uview-ui/libs/mixin/mpShare.js');
Vue.mixin(mpShare);

// i18n部分的配置
// 引入语言包，注意路径
import Chinese from '@/common/locales/zh.js';
import English from '@/common/locales/en.js';

// VueI18n
import VueI18n from '@/common/vue-i18n.min.js';

// VueI18n
Vue.use(VueI18n);

const i18n = new VueI18n({
	// 默认语言
	locale: 'zh',
	// 引入语言文件
	messages: {
		'zh': Chinese,
		'en': English,
	}
});

// 由于微信小程序的运行机制问题，需声明如下一行，H5和APP非必填
Vue.prototype._i18n = i18n;

const app = new Vue({
	i18n,
	store,
	...App
});

Vue.prototype.utils = utils;
Vue.prototype.$deviceId = uni.getDeviceInfo().deviceId

// api连接、文件路径、文件上传地址设置
Vue.prototype.baseURL = config.baseURL
Vue.prototype.fileURL = config.fileURL
Vue.prototype.fileUploadURL = config.fileUploadURL

// http拦截器，将此部分放在new Vue()和app.$mount()之间，才能App.vue中正常使用
import httpInterceptor from '@/common/http.interceptor.js';
Vue.use(httpInterceptor, app);

// http接口API抽离，免于写url或者一些固定的参数
import httpApi from '@/common/http.api.js';
Vue.use(httpApi, app);

// 用户行为分析
// import behaviorAnalysis from '@/common/behaviorAnalysis.js';

// 初始化埋点系统
const tracker = new Tracker()
tracker.init()

// 捕获uni-app全局错误
// uni.onError((error) => {
//     console.error('[全局异常]', error)
//     // 添加堆栈信息追踪
//     const stackTrace = new Error().stack 
//     tracker.trackError({
//         message: error.message,
//         stack: stackTrace,
//         raw: JSON.stringify(error)
//     }, { 
//         type: 'UNI_APP_ERROR',
//         platform: uni.getSystemInfoSync().platform 
//     })
    
//     // 可选：阻止默认错误提示
//     // return true 
// })
// 挂载到全局属性
Vue.prototype.$tracker = tracker
uni.$tracker = tracker

app.$mount();